﻿/*
 *  Copyright (c) 2009 Alessandro Pilotti
 *
 *  Permission is hereby granted, free of charge, to any person
 *  obtaining a copy of this software and associated documentation
 *  files (the "Software"), to deal in the Software without
 *  restriction, including without limitation the rights to use,
 *  copy, modify, merge, publish, distribute, sublicense, and/or sell
 *  copies of the Software, and to permit persons to whom the
 *  Software is furnished to do so, subject to the following
 *  conditions:
 *  
 *  The above copyright notice and this permission notice shall be
 *  included in all copies or substantial portions of the Software.
 *  
 *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 *  OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 *  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 *  HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 *  WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 *  OTHER DEALINGS IN THE SOFTWARE.
 */

using System;
using System.Collections.Generic;
using System.Text;
using System.Management.Automation;
using AlexPilotti.OutlookAccountManager;
using System.ComponentModel;

namespace AlexPilotti.OutlookAccountManager.PowerShell.Commands
{
    [RunInstaller(true)]
    public class OutlookAccountManagerSnapIn : PSSnapIn
    {
        public override string Name
        {
            get { return "OutlookAccountManagerSnapIn"; }
        }

        public override string Vendor
        {
            get { return "Alessandro Pilotti"; }
        }

        public override string VendorResource
        {
            get
            {
                return Name + "," + Vendor;
            }
        }

        public override string Description
        {
            get { return "Provides Outlook account management cmdlets"; }
        }

        public override string DescriptionResource
        {
            get
            {
                return Name + "," + Description;
            }
        }
    }

    public abstract class MAPICommand : Cmdlet
    {
        protected override void BeginProcessing()
        {
            base.BeginProcessing();

            AccountManager.MAPIInitialize();
        }

        protected override void EndProcessing()
        {
            base.EndProcessing();

            AccountManager.MAPIUninitialize();
        }
    }

    [Cmdlet(VerbsCommon.Get, "MAPIProfile")]
    public class GetMAPIProfileCommand : MAPICommand
    {
        protected override void ProcessRecord()
        {
            WriteObject(AccountManager.GetProfiles(), true);
        }
    }

    [Cmdlet(VerbsCommon.Get, "MAPIAccount")]
    public class GetMAPIAccountCommand : MAPICommand
    {
        [Parameter(Position = 0, Mandatory=true)]
        [ValidateNotNullOrEmpty]
        public string ProfileName { get; set; }

        [Parameter(Position = 1, Mandatory = false)]
        [ValidateNotNullOrEmpty]
        public uint? Id { get; set; }

        protected override void ProcessRecord()
        {
            if (Id != null)
                WriteObject(AccountManager.GetAccount(ProfileName, Id.Value));
            else
                WriteObject(AccountManager.GetAccounts(ProfileName), true);
        }
    }

    [Cmdlet(VerbsCommon.Set, "MAPIAccount", SupportsShouldProcess = true)]
    public class SetMAPIAccountCommand : MAPICommand
    {
        [Parameter(Position = 0, Mandatory = true, ValueFromPipeline = true)]        
        public AccountData Account { get; set; }

        [Parameter]
        public SwitchParameter Force { get; set; }

        [Parameter]
        public SwitchParameter PassThru { get; set; }

        protected override void ProcessRecord()
        {
            if (Force || ShouldProcess(Account.AccountName))
                AccountManager.SaveAccountData(Account);

            if(PassThru)
                WriteObject(Account);
        }
    }
}
